﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Runtime.InteropServices;

using alib;
using alib.Debugging;
using alib.Enumerable;

namespace agree
{
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	[DebuggerDisplay("{ToString(),nq}")]
	public class lexent_itok : ParseControl._lexent_chartobj, IChartObj<ChartSpan>
	{
		public lexent_itok(IRtParent parent, ILexeme le, ChartSpan w, Tfs tfs = null)
			: base(parent, le, tfs, w)
		{
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	[DebuggerDisplay("{ToString(),nq}")]
	public sealed class lexent_mwe : lexent_itok
	{
		static ChartSpan get_chartspan(ICollection<IWordToken> toks)
		{
			var e = toks.GetEnumerator();
			e.MoveNext();
			int i_start = e.Current.TokenSpan.StartIndex;
			while (e.MoveNext())
				;
			return new ChartSpan(i_start, e.Current.TokenSpan.EndIndex);
		}

		public lexent_mwe(IRtParent parent, ILexeme le, ICollection<IWordToken> toks)
			: base(parent, le, get_chartspan(toks))
		{
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/// 
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	[DebuggerDisplay("{ToString(),nq}")]
	public class pxo_unary : ParseControl._atfs_unary
	{
		public pxo_unary(IUnificationController parent, Rule license, ArrayTfs tfs, IChartObj unary, StartSymbol[] ss_matches)
			: base(parent, license, tfs, unary, ss_matches)
		{
			/// edge context is propagated from unary daughter upon demand
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/// 
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	[DebuggerDisplay("{ToString(),nq}")]
	public sealed class pxo_unary_pack : ParseControl._atfs_unary_pack, IChartObj<ChartSpan>
	{
		public pxo_unary_pack(IUnificationController parent, Rule license, ArrayTfs tfs, IChartObj unary, StartSymbol[] ss_matches)
			: base(parent, license, tfs, unary, ss_matches)
		{
			/// edge context is propagated from unary daughter upon demand
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/// 
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	[DebuggerDisplay("{ToString(),nq}")]
	public class pxo_nary : ParseControl._atfs_nary, IChartObj<ChartSpan>
	{
		public pxo_nary(IUnificationController parent, Rule rule, ArrayTfs tfs, IReadOnlyList<IChartObj> rgo, ChartSpan w, StartSymbol[] ss_matches)
			: base(parent, rule, tfs, rgo, w, ss_matches)
		{
		}
	};

	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	/// 
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	[DebuggerDisplay("{ToString(),nq}")]
	public class pxo_nary_pack : ParseControl._atfs_nary_pack, IChartObj<ChartSpan>
	{
		public pxo_nary_pack(IUnificationController parent, Rule rule, ArrayTfs tfs, IReadOnlyList<IChartObj> rgo, ChartSpan w, StartSymbol[] ss_matches)
			: base(parent, rule, tfs, rgo, w, ss_matches)
		{
		}
	};
}
